package pure.ui.core
{
	import pure.utils.DesG;
	import pure.ui.manager.SkinManager;
	import pure.ui.skins.*;
	import flash.display.*;
	import flash.events.*;
	import flash.filters.*;
	import flash.system.ApplicationDomain;
		
	/**
	 * 绝望UI组件基类 ---- 不可实例化！
	 * @author Des
	 * 
	 */
	
public class Component extends Sprite
{
	public function Component(x:Number,y:Number,skin:ISkin)
	{
		_init();
		_addSkin(skin);
		move(x, y);
	}
	
	
	
	/*model*/
	
	protected var _width:Number;	// 宽度
	
	protected var _height:Number;	// 高度
	
	protected var _skin:ISkin;	// 皮肤

	protected var _enabled:Boolean;	// 是否可交互
	
	
	/*cache*/
	
	protected var _isClear:Boolean;
	
	protected var _definition:String;	// 保存当前位图的类定义名称
	
	
	
	
	/**
	 * 位置
	 * @param x			坐标X
	 * @param y			坐标Y
	 **/
	public function move(x:Number, y:Number):void
	{
		this.x = x;
		this.y = y;
	}
	
	/**
	 * 大小(次帧渲染)
	 * @param w			组件宽度
	 * @param h			组件高度
	 **/
	public function setSize(w:Number,h:Number):void
	{
		if (_width == w && _height == h)
		{
			return;
		}
		if (w < 0 || h < 0) 
		{
			throw new Error("Component::setSize - 参数不可为负数！");
		}
		_width = w;
		_height = h;
		update();
	}
	
	/**
	 * 更新
	 * <TODO>画面状态切换时，大小×换肤×滑鼠事件
	 **/
	public function update():void
	{
		this.addEventListener(Event.ENTER_FRAME,____onEnterFrame);
	}
	
	
	/**
	 * 毁灭
	 */
	public function destroy():void
	{
		_clear();
		this._skin = null;
		if (this.parent)
		{
			this.parent.removeChild(this);
		}
	}
	
	
	
	
	
	/* ----------------------------------------------------    get / set    ----------------------------------------------------*/
	
	
	
	
	
	// 皮肤
	public function set skin(value:ISkin):void
	{
		this._skin = value;
		update();
	}
	
	public function get skin():ISkin
	{
		return this._skin;
	}
	
	
	// 宽度(次帧渲染)
	override public function set width(w:Number):void
	{
		setSize(w, _height);
	}
	
	override public function get width():Number
	{
		return _width;
	}
	
	// 高度(次帧渲染)
	override public function set height(h:Number):void
	{
		setSize(_width, h);
	}
	
	override public function get height():Number
	{
		return _height;
	}
	
	// 是否可交互
	public function set enabled(b:Boolean):void
	{
		if (_enabled != b)
		{ 
			this._enabled = b;
			this.mouseEnabled = b;

			// 子组件递归
			var d:DisplayObject;
			var len:int = this.numChildren;
			for (var i:int = 0; i < len; i++)
			{
				d = this.getChildAt(i);
				if (d is Component)
				{
					Component(d).enabled = b;
				}
			}
			update();
		}
	}
	
	public function get enabled():Boolean
	{
		return _enabled;
	}
	
	
	
	
	
	/* ----------------------------------------------------    private    ----------------------------------------------------*/
	
	
	
	
	
	protected function _init():void
	{
		_initSelf();
		_addChildren();
	}

	/**
	 * 初始化添加皮肤
	 * @param skin			皮肤实例
	 **/
	protected function _addSkin(skin:ISkin):void
	{
		if (skin)
		{
			this.skin = skin;
		}
	}
	
	/**
	 * 初始化自身
	 **/
	protected function _initSelf():void
	{
		this.tabChildren = false;
		this.tabEnabled = false;
		this._isClear = true;
		this._enabled = true;
	}
	
	/**
	 * 子元素
	 **/
	protected function _addChildren():void
	{
		// 在子类中实现！
	}
	
	/**
	 * 次帧渲染事件
	 **/
	protected function ____onEnterFrame(e:Event):void
	{
		this.removeEventListener(Event.ENTER_FRAME, ____onEnterFrame);
		_render();
	}
		
	/**
	 * 渲染
	 **/
	protected function _render():void
	{
		// 是否可交互
		if (_enabled)
		{
			if (!this._skin||!_getBitmap('invalidation'))
			{
				this.filters = null;
			}
		}
		else
		{
			// 不可交互时，没有相关皮肤资源，默认使用黑白滤镜！
			if (!this._skin||!_getBitmap('invalidation'))
			{
				DesG.applyGrayFilter(this);
			}
			else
			{
				_skip('invalidation');
			}
			return;
		}
		
		// 重新绘制
		_draw();
	}
	
	
	/**
	 * 绘制
	 * <TODO>该方法由渲染自动调用！
	 **/
	protected function _draw():void
	{
		// 在子类中实现！
	}

	
	/**
	 * 更换位图
	 * <TODO>判断更换后的资源是否与之前相同，不同则更换！
	 * @param definition		类定义名称
	 **/
	protected function _skip(definition:String):void
	{
		// 在子类中实现！
	}
	
	
	/**
	 * 绘缺省皮肤
	 * @param fillColor			填充色
	 * @param thickness			边线粗细
	 * @param ellipse			四角内径
	 * @param alpha				透明度
	 * @param lineColor			边线颜色
	 **/
	protected function _drawNoSkin(fillColor:uint, thickness:Number = 1, ellipse:Number = 2, alpha:Number = 0.9, lineColor:uint = 0 ):void
	{
		this.graphics.clear();
		this.graphics.lineStyle(thickness,lineColor,alpha);
		this.graphics.beginFill(fillColor,alpha);
		this.graphics.drawRoundRect(0, 0, this._width, this._height, ellipse, ellipse);
		this._isClear = false;
	}

	
	/**
	 * 擦除缺省皮肤
	 **/
	protected function _clear():void
	{
		if (!this._isClear) 
		{
			this.graphics.clear();
			this._isClear = true;
		}
	}
	
	
	/**
	 * 从皮肤获取位图
	 * @param property			皮肤属性
	 * @param app				应用域
	 */
	protected function _getBitmap(property:String, app:ApplicationDomain = null ):BitmapData
	{
		return this._skin.getBitmap(property,_width,_height,app)
	}

	
}
}